import SInput from '@C/base/SFields/SInput';
import SNumber from '@C/base/SFields/SNumber';
import SPassword from '@C/base/SFields/SPassword';
import STextArea from '@C/base/SFields/STextArea';
import SSearch from '@C/base/SFields/SSearch';
import SCheckbox from '@C/base/SFields/SCheckbox';
import SCheckboxGroup from '@C/base/SFields/SCheckboxGroup';
import SRadio from '@C/base/SFields/SRadio';
import SRadioGroup from '@C/business/SFields/SRadioGroup';
import SSwitch from '@C/base/SFields/SSwitch';
import SDatePicker from '@C/base/SFields/SDatePicker';
import SMonthPicker from '@C/base/SFields/SDatePicker/SMonthPicker';
import SQuarterPicker from '@C/base/SFields/SDatePicker/SQuarterPicker';
import STimePicker from '@C/base/SFields/SDatePicker/STimePicker';
import SWeekPicker from '@C/base/SFields/SDatePicker/SWeekPicker';
import SYearPicker from '@C/base/SFields/SDatePicker/SYearPicker';
import SRangePicker from '@C/base/SFields/SRangePicker';
import SSelect from '@C/base/SFields/SSelect';
import './index.less';

class SFields {
  getComponent() {
    return {
      /** SInput 组件说明
       * @author: JasonStandFor
       * @description Desc:: 根据 type 匹配相应的组件
       * @name {String} 与表单绑定的 key
       * @maxLength {Number} 表单最大值，默认最大 32 位
       * @label {String} 表单 label
       * @span {String|Number} 栅格项
       * @required {Boolean} 必填项
       * @ruleIcon {Boolean|String} 是否显示必填项的 icon, 为 String 类型时，只接受 @ant-design/icons 库的 icon
       * @formItemConfig {FormItemProps} 来自 antd 的 Form.Item 属性
       * @param { antd.InputProps } props
       * @return SInput
       * @example:
       example 1: SInput
       <SFields type="input" name="one" required ruleIcon />
       <SFields label="测试标签" name="two" />
       example 2: SInput
       <SFields type="input" name="one" required ruleIcon="ExclamationCircleOutlined" />
       <SFields span={6} name="two" />
       example 3: SInput
       <SFields type="input" name="one" required />
       <SFields label='标签' name="two" formItemConfig={{ label: '测试' }}/>
       */
      Input: SInput,
      /** SNumber 组件说明
       * @author: JasonStandFor
       * @description Desc:: 根据 type 匹配相应的组件
       * @name {String} 与表单绑定的 key
       * @label {String} 表单 label
       * @span {String|Number} 栅格项
       * @required {Boolean} 必填项
       * @ruleIcon {Boolean|String} 是否显示必填项的 icon, 为 String 类型时，只接受 @ant-design/icons 库的 icon
       * @isForcedFill {Boolean} 是否填充剩余部分
       * @formItemConfig {FormItemProps} 来字 antd 的 Form.Item 属性
       * @param { antd.InputNumberProps } props
       * @return SNumber
       * @example:
       example 1: SNumber
       <SFields type="input" name="one" required ruleIcon min={1} max={10} onChange={() => {}} />
       */
      Number: SNumber,
      /** SPassword 组件说明
       * @author: JasonStandFor
       * @description Desc:: 根据 type 匹配相应的组件
       * @name {String} 与表单绑定的 key
       * @label {String} 表单 label
       * @span {String|Number} 栅格项
       * @required {Boolean} 必填项
       * @ruleIcon {Boolean|String} 是否显示必填项的 icon, 为 String 类型时，只接受 @ant-design/icons 库的 icon
       * @formItemConfig {FormItemProps} 来字 antd 的 Form.Item 属性
       * @param { antd.InputProps } props
       * @return SPassword
       * @example:
       example 1: SPassword
       <SFields
       type="password"
       name="one"
       required
       ruleIcon
       iconRender={(visible) => {
         return visible ? getAntdIcon() : getAntdIcon('ExclamationCircleOutlined')
       }}
       />
       */
      Password: SPassword,
      /** STextArea 组件说明
       * @author: JasonStandFor
       * @description Desc:: 根据 type 匹配相应的组件
       * @name {String} 与表单绑定的 key
       * @maxLength {Number} 表单最大值，默认最大 100 位
       * @label {String} 表单 label
       * @span {String|Number} 栅格项
       * @required {Boolean} 必填项
       * @ruleIcon {Boolean|String} 是否显示必填项的 icon, 为 String 类型时，只接受 @ant-design/icons 库的 icon
       * @formItemConfig {FormItemProps} 来字 antd 的 Form.Item 属性
       * @param { antd.InputProps } props
       * @return STextArea
       * @example:
       example 1: STextArea
       <SFields type="TextArea" name="one" required ruleIcon autoSize/>
       */
      TextArea: STextArea,
      /** SSearch 组件说明
       * @author: JasonStandFor
       * @description Desc:: 根据 type 匹配相应的组件
       * @name {String} 与表单绑定的 key
       * @maxLength {Number} 表单最大值，默认最大 50 位
       * @label {String} 表单 label
       * @span {String|Number} 栅格项
       * @required {Boolean} 必填项
       * @ruleIcon {Boolean|String} 是否显示必填项的 icon, 为 String 类型时，只接受 @ant-design/icons 库的 icon
       * @formItemConfig {FormItemProps} 来字 antd 的 Form.Item 属性
       * @param { antd.InputProps } props
       * @return SSearch
       * @example:
       example 1: SSearch
       <SFields type="search" name="one" required ruleIcon onSearch={() => {}}/>
       */
      Search: SSearch,
      /** SCheckbox 组件说明
       * @author: JasonStandFor
       * @description Desc:: 根据 type 匹配相应的组件
       * @name {String} 与表单绑定的 key
       * @label {String} 表单 label
       * @span {String|Number} 栅格项
       * @required {Boolean} 必填项
       * @ruleIcon {Boolean|String} 是否显示必填项的 icon, 为 String 类型时，只接受 @ant-design/icons 库的 icon
       * @formItemConfig {FormItemProps} 来字 antd 的 Form.Item 属性
       * @param { antd.CheckboxProps } props
       * @return SCheckbox
       * @example:
       example 1: SCheckbox
       <SField type="checkbox" name="two" indeterminate required checked disabled onChange={() => {}}/>
       */
      Checkbox: SCheckbox,
      /** SCheckboxGroup 组件说明
       * @author: JasonStandFor
       * @description Desc:: 根据 type 匹配相应的组件
       * @name {String} 与表单绑定的 key
       * @label {String} 表单 label
       * @span {String|Number} 栅格项
       * @required {Boolean} 必填项
       * @ruleIcon {Boolean|String} 是否显示必填项的 icon, 为 String 类型时，只接受 @ant-design/icons 库的 icon
       * @formItemConfig {FormItemProps} 来字 antd 的 Form.Item 属性
       * @param { antd.CheckboxGroupProps } props
       * @return SCheckboxGroup
       * @example:
       example 1: SCheckboxGroup
       <SField type="checkboxGroup" name="two" indeterminate required checked disabled onChange={() => {}}/>
       */
      CheckboxGroup: SCheckboxGroup,
      /** SRadio 组件说明
       * @author: JasonStandFor
       * @description Desc:: 根据 type 匹配相应的组件
       * @name {String} 与表单绑定的 key
       * @label {String} 表单 label
       * @span {String|Number} 栅格项
       * @required {Boolean} 必填项
       * @ruleIcon {Boolean|String} 是否显示必填项的 icon, 为 String 类型时，只接受 @ant-design/icons 库的 icon
       * @formItemConfig {FormItemProps} 来字 antd 的 Form.Item 属性
       * @param { antd.RadioProps } props
       * @return SRadio
       * @example:
       example 1: SRadio
       <SField type="radio" name="two" required checked disabled />
       */
      Radio: SRadio,
      /** SRadioGroup 组件说明
       * @author: JasonStandFor
       * @description Desc:: 根据 type 匹配相应的组件
       * @name {String} 与表单绑定的 key
       * @label {String} 表单 label
       * @span {String|Number} 栅格项
       * @required {Boolean} 必填项
       * @ruleIcon {Boolean|String} 是否显示必填项的 icon, 为 String 类型时，只接受 @ant-design/icons 库的 icon
       * @formItemConfig {FormItemProps} 来字 antd 的 Form.Item 属性
       * @param { antd.RadioGroupProps } props
       * @return SRadioGroup
       * @example:
       example 1: SRadioGroup
       <SField type="radioGroup" name="two" required checked disabled onChange={() => {}}/>
       */
      RadioGroup: SRadioGroup,
      /** SSwitch 组件说明
       * @author: JasonStandFor
       * @description Desc:: 根据 type 匹配相应的组件
       * @name {String} 与表单绑定的 key
       * @label {String} 表单 label
       * @span {String|Number} 栅格项
       * @required {Boolean} 必填项
       * @placement {String} 开关打开后, 子组件的显式方向
       * @ruleIcon {Boolean|String} 是否显示必填项的 icon, 为 String 类型时，只接受 @ant-design/icons 库的 icon
       * @formItemConfig {FormItemProps} 来字 antd 的 Form.Item 属性
       * @param { antd.SwitchProps } props
       * @return SSwitch
       * @example:
       example 1: SSwitch
       const [value, setValue] = useState(false);
       <SField
       type="switch"
       name="switch"
       placement="top"
       required
       checked={value}
       onChange={(val) => {
          setValue(val);
        }}
       >
       <SField.Input name="switch_1" span={12}/>
       <SField.Input name="switch_2" span={12}/>
       <SField/>
       */
      Switch: SSwitch,
      /** SDatePicker 组件说明
       * @author: JasonStandFor
       * @description Desc:: 根据 type 匹配相应的组件
       * @name {String} 与表单绑定的 key
       * @label {String} 表单 label
       * @span {String|Number} 栅格项
       * @required {Boolean} 必填项
       * @ruleIcon {Boolean|String} 是否显示必填项的 icon, 为 String 类型时，只接受 @ant-design/icons 库的 icon
       * @isForcedFill {Boolean} 是否填充剩余部分
       * @disabledDate {DisabledOption} - 禁用选项
       * @formItemConfig {FormItemProps} 来字 antd 的 Form.Item 属性
       * @param { antd.DatePickerProps } props
       * @return SDatePicker
       * @example:
       example 1: SDatePicker
       <SField.DatePicker
       name="one"
       required
       onChange={(value, dateString) => {
          console.log(value, dateString)
        }}
       />
       // disabledDate={(date) => {
       //   // console.log('date: ', date.date());
       //   // 1、15 可选，其它禁用
       //   return date.date() === 15 || date.date() === 1
       //   // 15-31 可选，小于 15 禁用
       //   // return date.date() < 15
       // }}
       disabledDate={[1, 2, 5]}
       */
      DatePicker: SDatePicker,
      MonthPicker: SMonthPicker,
      QuarterPicker: SQuarterPicker,
      TimePicker: STimePicker,
      WeekPicker: SWeekPicker,
      YearPicker: SYearPicker,
      RangePicker: SRangePicker,
      /** SSelect 组件说明
       * @author: JasonStandFor
       * @description Desc:: 根据 type 匹配相应的组件
       * @name {String} 与表单绑定的 key
       * @maxLength {Number} 表单最大值，默认最大 32 位
       * @label {String} 表单 label
       * @span {String|Number} 栅格项
       * @required {Boolean} 必填项
       * @ruleIcon {Boolean|String} 是否显示必填项的 icon, 为 String 类型时，只接受 @ant-design/icons 库的 icon
       * @formItemConfig {FormItemProps} 来自 antd 的 Form.Item 属性
       * @return SSelect
       * @example:
       example 1: SSelect
       <SFields.SSelect name="one" required/>
       */
      SSelect: SSelect,
    }
  }
}

const SField = new SFields().getComponent();

export {
  SField
}

export default new SFields().getComponent();
